Stable Diffusion LoRA 训练不完全指北(2)

您所在的位置:网站首页 face与be faced with的区别 Stable Diffusion LoRA 训练不完全指北(2)

Stable Diffusion LoRA 训练不完全指北(2)

2023-06-06 06:26| 来源: 网络整理| 查看: 265

前言

继上一篇专栏讲了一些比较通用的技巧,这次继续补充了一些不常用的参数,同时简单讨论了一下Dreambooth和正则化。然后对现有的一些噪声做了一些实验分析,希望能够帮助到大家。有问题或者指出错误欢迎评论区友善交流。

想要更好的格式可以看 https://zpfam.gitbook.io/lora-jiao-cheng-xi-lie/

一些新的或者较少用到参数的补充

数据增强相关

数据增强是在训练时对图片做变换的方法,可用于防止过拟合,但是,能用的一共有四种: color_aug, flip_aug, face_crop_aug_range, random_crop。

其中只有翻转(flip_aug)能和cache latent兼容,因为latent可以直接翻转。

四种都不推荐使用,因为裁剪图片的两种cropping方法都会导致tag对应不上。color_aug无法启用cache latent导致训练慢,得不偿失。翻转的flip_aug在图像不对称的情况下表现差,会导致无法正确生成人物不对称的特征(刘海、发饰等)。

caption dropout相关

网上关于这几个caption dropout的说明少之又少,甚至作者在文档里面也没有包含这些参数,只能在代码注释里面找到说明。但是caption dropout在某些情况下对模型性能有提升,所以拿出来讲一下。

caption_dropout_rate

丢弃全部标签的概率,对一个图片概率不使用caption或class token

caption_dropout_every_n_epochs

每N个epoch丢弃全部标签。

caption_tag_dropout_rate

按逗号分隔的标签来随机丢弃tag的概率。如果使用DB+标签的训练方法训练画风,推荐使用这个参数,能够有效防止tag过拟合,一般选择0.2-0.5之间的值。训练人物则无需开启。

token_warmup_min、token_warmup_step

两个token热身相关的参数。第一个是最小学习的token数量,第二个是在多少步后达到最大token数量。

token_warmup可以理解为另一种形式的caption dropout,但是如果不随机打乱token,则只会学习前面N个token。本人并未实测过启用这两个参数的效果,有兴趣可以自行实验。

max_grad_norm

限制模型更新梯度的大小,改善数值稳定性。梯度的范数超过这个值将会被缩放到这个大小,一般来说无需设置。

gradient_accumulation_steps

梯度累积步数,用于在小显存上模拟大batch size的效果。如果显存足够使用4以上的batch size就没必要启用。

log_with、wandb_api_key

选择logger类型,可选tensorboard或者wandb。使用wandb需要指定api key。

multires_noise_iterations、multires_noise_discount

多分辨率/金字塔噪声相关参数。详情看下面噪声实验的部分。

prior_loss_weight

DB训练当中先验部分的权重,控制正则化图像的强度,论文中使用的是1的值,如无特殊情况无需更改。

debug_dataset

不训练模型,仅输出训练集元数据和训练信息,可以用来看设置是否正确。

vae_batch_size

cache lantent的时候VAE编码器的batch size,和训练效果无关。一般来说使用2-4可以加速一点cache latent的过程。因为VAE编码器本身参数量比较小,在Linux下8G的显卡也能开启4。Windows下显存占用较多,建议不开启或者使用2。

Dreambooth浅析

Dreambooth是什么,和Lora的区别?

此部分并非训练必要,理解有困难可以酌情跳过,或者参考秋葉aaaki这篇文章(通俗易懂):https://www.bilibili.com/read/cv22578510

Dreambooth是一种微调大模型加入正则化损失函数防止语言漂移的方法,而Lora是通过矩阵低秩分解的方法来降低微调模型所需的参数量。简单来说DB修改的是训练过程/Loss函数,Lora修改的是网络架构,两个修改的是完全不同的东西所以可以相互兼容。

Dreambooth Loss

此为Dreambooth所使用的Loss函数,由两部分构成,实际并不复杂:第一部分为训练集图片的重建损失,第二部分是正则化图像(先验)损失。

代码里的实现表现为训练集和正则化图片以相同的方式训练,但是正则化图片的梯度更新会乘以先验Loss权重,也就是公式中的λ,训练参数中的prior_loss_weight。

正则化是不是必要的?

不是。在使用标签文件训练的时候,可以不需要使用正则化。但是如果只是使用class token训练,建议使用。

原因在于使用标签文件的时候TE模型对单一token过拟合的概率较小,反而是UNet部分更加容易过拟合,加入正则化可以改善画风过拟合。

没有使用标签文件的时候所有文件都以class token作为标签,语言漂移的问题可以通过正则化缓解。

需要什么样的正则化图片?需要提供标签吗?

论文中使用的正则化图像是在相同底模上用AI生成的相同类的图片。如果使用class token训练,可以根据你需要训练的内容使用如1girl等来生成。

如果在标签文件上训练,那么正则化文件是不需要标签的,只需要指定对应的class token即可。

一个我认为有用的小技巧:使用随机tag生成不同背景、场景、姿势、角度、光照的正则化图片能够有效提升效果。

不同噪声的一些实验以及随想

不想看理论和实验过程的可以直接跳转结论。

为什么要使用不同的噪声?不同噪声之间有什么区别?

首先这两篇博文的核心观点都是现有的模型只能生成像素均值在0.5左右的图片(关联:维数灾难),无法生成更亮或者更暗的图片。因为独立同分布的高斯噪声是非常高频的,模型需要非常长的时间才能学习到更加低频率的信息,包括图片的零频率(像素均值)。

于是有了以下两种解决方法:noise_offset(噪声偏移)、multires_noise(多分辨率/金字塔噪声)

噪声偏移通过在图片中随机添加统一的值来快速改变图片的均值(零频率)从而使模型学习能够更快学习到图片的均值从而能够生成更亮或者更暗的图片。

而金字塔噪声通过反复叠加不同分辨率的噪声来增加低频的部分从而达到同样的效果。

由于multires文章的作者提出了其他噪声如perlin noise和pink noise,这里简单在pytorch上实现了Perlin噪声作为对比,之后会放出相关代码的Colab和提交训练脚本的PR供大家探索。

但限于本人没有系统学习过数字信号处理的内容,以下内容非常主观,如果有错误或者更好的解释欢迎提出。

不同噪声的频谱和相位谱可视化

高斯噪声(白噪声)

可以看到白噪声的频率分布非常均匀,并且像素之间的关联度是0。这是模型默认使用的噪声。

金字塔噪声

相位谱中可以看出相邻的像素之间有一定的关联。同时从频率谱中可以看出低频部分大概在7-8之间,高频的部分在0-6之间。

iteration控制叠加次数,并不是越高越好,因为根据图片分辨率不同,噪声的分辨率可能超过图像本身分辨率,效果提升非常微弱。6-8已经足够。

discount控制低分辨率(低频部分)的权重,如果使用过低的值那和高斯噪声区别不大。越高的值对低频的增强越多。一般设置0.4-0.8之间即可。

Perlin噪声(无扰动)

Perlin噪声是一种用于生成模拟自然随机纹理和渐变效果的算法,其特点是平滑且连续。常用于自然地形、纹理生成等,最著名的应用应该是Minecraft里面的地形生成。

Octave相当于多分辨率噪声中的叠加次数。

Persistence相当于多分辨率噪声中的discount。

可以从频谱中看到低频的部分被增强了非常多,同时相位谱中可以看出图像的一些结构化的特征。

perlin_octaves_6_persistence_0.8_pertubation_0.0

Perlin噪声(有扰动)

因为原生的Perlin噪声不够随机,可能导致无法在训练过程中完全将图片变为高斯分布,我尝试加入一些随机扰动来去除图中的固有属性,同时保留部分低频信息。可以看到这时候的相位谱已经几乎看不出原图的特征了,然后频谱也和金字塔噪声比较相似。

perlin_octaves_6_persistence_0.8_pertubation_0.4

实验设置和样本

全部使用相同的图片和标签来训练lycoris模型。考虑有色噪声会增加拟合难度,base模型训练15个epoch,其余都训练30个epoch。训练集的标签没有经过裁剪和调整,所以细节的特征不具有代表性。

同时我还为Perlin噪声引入了同样的噪声偏移机制来改变零频率,因为我无法复现金字塔噪声作者的效果。我认为可能的原因是Lora对模型的控制不够,需要进一步在大模型上微调来验证。另外一种可能的解释是噪声的零频率期望值是不变的,但是我的实验结果不能支撑这一点。还有一种可能是训练集中例子过少导致模型无法学习。

以下两张图是我自己写的prompt:

下面是用原图的prompt生成:

原图:

相同prompt生成的图:

结论

首先这个初步结论只对Lora训练有效,大模型微调的效果还需要进一步验证。

噪声偏移可以很好改善极亮或者极暗图片的生成,但是会出现色温偏移的问题,例子里的图片明显偏冷色调。

金字塔噪声无法改善亮度问题,但是生成的图片对原图的还原度最高,但是有时候会有涂抹感。(也有可能是其他方法拟合太慢)

Perlin噪声的效果基本与金字塔噪声相同,同时在图片颜色上有更平滑的过渡。我只实验了非常少的几组参数,其他的需要更多实验验证。

对于不同噪声的主观的感受还需要各位自己评价,如果不知道使用什么就用金字塔噪声吧。

这里只是抛砖引玉,有兴趣的同学可以等我放出代码后试一下Perlin噪声的各种参数,还可以尝试使用IDFT实现粉色噪声等有色噪声。

下篇看心情更新吧,最近比较忙,各位谅解。

引文

https://arxiv.org/abs/2208.12242

https://www.crosslabs.org/blog/diffusion-with-offset-noise

https://wandb.ai/johnowhitaker/multires_noise/reports/Multi-Resolution-Noise-for-Diffusion-Model-Training--VmlldzozNjYyOTU2



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3